package be.ipl.finito.usecasesImpl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import be.ipl.finito.dao.CaseDao;
import be.ipl.finito.dao.JoueurDao;
import be.ipl.finito.dao.PartieDao;
import be.ipl.finito.dao.PlateauDao;
import be.ipl.finito.domaine.Case;
import be.ipl.finito.domaine.Jeton;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.domaine.Plateau;
import be.ipl.finito.exceptions.CaseOccupeeException;
import be.ipl.finito.usecases.GestionPlateau;
import be.ipl.finito.util.Util;

@Singleton
@Startup
public class GestionPlateauImpl implements GestionPlateau {

	@EJB
	PartieDao partieDao;
	@EJB
	JoueurDao joueurDao;
	@EJB
	PlateauDao plateauDao;
	@EJB
	CaseDao caseDao;

	@Override
	public Plateau placerJeton(Plateau plateau, Jeton jeton, Case caseJeton)
			throws CaseOccupeeException {
		Util.checkObject(jeton, "Le jeton");
		Util.checkObject(caseJeton, "La case");

		plateau = plateau.placerJeton(jeton, caseJeton);

		caseDao.enregistrer(caseJeton);
		plateauDao.mettreAJour(plateau);

		return plateau;

	}

	@Override
	public Plateau deplacerJeton(Plateau plateau, Jeton jeton, Case caseJeton)
			throws CaseOccupeeException {

		Case oldCase = plateau.deplacerJeton(jeton, caseJeton);

		caseDao.supprimer(oldCase.getId());
		caseDao.mettreAJour(caseJeton);
		plateauDao.mettreAJour(plateau);

		return plateau;
	}

	@Override
	public int calculerScore(Partie partie, Joueur joueur) {
		Util.checkObject(partie, "La partie");
		Util.checkObject(joueur, "Le joueur");
		partieDao.recharger(partie.getId_partie());
		joueurDao.recharger(joueur.getIdJoueur());
		Plateau plateau = partie.getPlateau(joueur);
		return plateau.getScore();
	}

	@Override
	public List<Jeton> calculerSuite(Partie partie, Joueur joueur) {
		Util.checkObject(partie, "La partie");
		Util.checkObject(joueur, "Le joueur");
		partieDao.recharger(partie.getId_partie());
		joueurDao.recharger(joueur.getIdJoueur());
		Plateau plateau = partie.getPlateau(joueur);
		return plateau.calculerSuite();
	}

	@Override
	public Plateau ajouterJetonAPoser(Partie partie, Joueur joueur, Jeton jeton) {
		Util.checkObject(partie, "La partie");
		Util.checkObject(joueur, "Le joueur");
		partieDao.recharger(partie.getId_partie());
		joueurDao.recharger(joueur.getIdJoueur());
		Plateau plateau = partie.getPlateau(joueur);
		plateau.ajouterJetonAPoser(jeton);

		return plateau;
	}

	@Override
	public Jeton getJetonViaNumero(int numero) {
		Util.checkPositive(numero, "Le numero du jeton");
		List<Jeton> listeJ = GestionPartieImpl.getInstance().creerJeton();
		for (Jeton j : listeJ) {
			if (j.getNum() == numero) {
				return j;
			}
		}
		return null;
	}

}
